From f78175be51de90c3e3af339a05b8a352b13315a4 Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Tue, 15 May 2007 10:13:11 +0100 Subject: [PATCH] x86-64/hvm: pio result storing Don't clear upper 32 bits on 8- and 16-bit PIO reads. Signed-off-by: Jan Beulich --- xen/arch/x86/hvm/io.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/xen/arch/x86/hvm/io.c b/xen/arch/x86/hvm/io.c index f0f8ea8ecb..0c3027a20c 100644 --- a/xen/arch/x86/hvm/io.c +++ b/xen/arch/x86/hvm/io.c @@ -418,11 +418,10 @@ static inline void set_eflags_PF(int size, unsigned long result, static void hvm_pio_assist(struct cpu_user_regs *regs, ioreq_t *p, struct hvm_io_op *pio_opp) { - unsigned long old_eax; - int sign = p->df ? -1 : 1; - if ( p->data_is_ptr || (pio_opp->flags & OVERLAP) ) { + int sign = p->df ? -1 : 1; + if ( pio_opp->flags & REPZ ) regs->ecx -= p->count; @@ -459,14 +458,15 @@ static void hvm_pio_assist(struct cpu_user_regs *regs, ioreq_t *p, } else if ( p->dir == IOREQ_READ ) { - old_eax = regs->eax; + unsigned long old_eax = regs->eax; + switch ( p->size ) { case 1: - regs->eax = (old_eax & 0xffffff00) | (p->data & 0xff); + regs->eax = (old_eax & ~0xff) | (p->data & 0xff); break; case 2: - regs->eax = (old_eax & 0xffff0000) | (p->data & 0xffff); + regs->eax = (old_eax & ~0xffff) | (p->data & 0xffff); break; case 4: regs->eax = (p->data & 0xffffffff); -- 2.30.2